class OrdenSalida < ActiveRecord::Base
  belongs_to :ejecutivo
  belongs_to :centro
  
  has_many :orden_salida_detalles
  has_many :orden_salida_presupuestos
  
  TIPO_REFERENCIA = {
    :bonificacion_especie => 1,
    :evaluacion => 2,
    :presencia => 3,
    :promocion => 4
  }
  REFERENCIA = {
    1 => 'Bonificacion en Especie', 2 => 'Evaluacion', 3 => 'Presencia', 4 => 'Promocion'
  }
  
  # puntaje acumulado requerido para autorizar la orden de salida
  attr_accessor :puntos_acumulados
  
  validates_presence_of :en_atencion_de, :domicilio, :tipo_presupuesto_id, :centro_id
  validates_numericality_of :monto_total, :monto_total_precio_publico, :monto_total_ieps, :allow_nil => true

  before_save :actualizar_importes
  
  def detalle_attributes=(detalle_attributes)
    detalle_attributes.each do |attributes|
      orden_salida_detalles.build(attributes)
    end
  end
  
  def consecutivo
    "%06d" % id + '/' + created_at.strftime("%Y")
    
  end
  
  def puntos_suficientes?
    unless puntos_acumulados.nil?
      puntos_disponibles > puntos_acumulados
    else
      false
    end
  end

  # TODO: on_create?
  def validate
    errors.add("Puntos insuficientes para generar la salida") if validar_evaluacion?
    errors.add("Presupuesto insuficiente") unless presupuesto_suficiente
  end

  def puntos_disponibles
    puntos = 0
    orden_salida_detalles.each do |d|
      producto = Producto.find(d.producto_id)
      puntos += producto.puntos_canje
    end
    puntos
  end
  
  def validar_evaluacion?
    if tipo_referencia == TIPO_REFERENCIA[:evaluacion]
      puntos_suficientes?
    else
      false
    end
  end
  
  def detalles_cuervo
    conditions = [
      "orden_salida_id = :orden_salida_id AND producto_id IN (SELECT [id] FROM PRODUCTOS WHERE sociedad_id = 20)",
      {:orden_salida_id => self.id}
    ]
    
    OrdenSalidaDetalle.find(:all, :conditions => conditions)
  end
  
  def detalles_becle
    conditions = [
      "orden_salida_id = :orden_salida_id AND producto_id IN (SELECT [id] FROM PRODUCTOS WHERE sociedad_id = 25)",
      {:orden_salida_id => self.id}
    ]
    OrdenSalidaDetalle.find(:all,:conditions => conditions)
  end
  
  def month_year
    self.created_at.strftime("%Y-%m")
  end
  
  def actualizar_importes
    logger.debug "OrdenSalida#actualizar_importes"
    
    importe = 0.0
    importe_publico = 0.0
    importe_ieps = 0.0

    orden_salida_detalles.each do |d|
      d.actualizar_importes
        
      importe += d.importe
      importe_publico += d.importe_publico
      importe_ieps += d.importe_ieps
    end
      
    self.monto_total_ieps = importe_ieps
    self.monto_total = importe
    self.monto_total_precio_publico = importe_publico
    
    logger.debug "ieps: #{self.monto_total_ieps}, costo: #{self.monto_total}, publico: #{self.monto_total_precio_publico}"
  end
  
  def agregar_detalle(producto, cantidad=1)
    item = orden_salida_detalles.detect {|i| i.producto_id == producto.id}
    
    if item.nil?
      orden_salida_detalles << OrdenSalidaDetalle.new(:producto_id => producto.id,
        :cantidad => cantidad, :costo_unitario => producto.costo_cuervo,
        :precio_publico => producto.precio_venta, :precio_ieps => 0.0)
    else
      item.cantidad += cantidad
    end
    
    actualizar_importes
    
  end
  
  def guardar(lista_presupuestos)
    nil ==  lista_presupuestos
  end
end
